package com.demon.auto.utils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * @author huangrz
 * @version 1.0
 * @date 2025/02/17 9:57
 */
public class LocalDateUtil {

    public final static DateTimeFormatter FORMATTER_DATE_TIME = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    public final static DateTimeFormatter FORMATTER_DATE = DateTimeFormatter.ofPattern("yyyy-MM-dd");


    // region 年月日 时分秒

    /**
     * 获取时间戳
     *
     * @param dateTime 时间对象
     * @return Long
     */
    public static Long getTimestamp(LocalDateTime dateTime) {
        return dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
    }

    /**
     * 将 Date 转换为 LocalDateTime
     *
     * @param date Date类型日期
     * @return LocalDateTime
     */
    public static LocalDateTime dateToLocalDateTime(Date date) {
        return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
    }

    /**
     * 将 LocalDateTime 转换为 Date
     *
     * @param localDateTime 要转换的 LocalDateTime 对象
     * @return 转换后的 Date 对象
     */
    public static Date localDateTimeToDate(LocalDateTime localDateTime) {
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 日期字符串 转 LocalDateTime
     *
     * @param dateStr 日期字符串 yyyy-MM-dd HH:mm:ss
     * @return LocalDateTime
     */
    public static LocalDateTime parserLocalDateTime(String dateStr) {
        return LocalDateTime.parse(dateStr, FORMATTER_DATE_TIME);
    }

    /**
     * 日期字符串 转 LocalDateTime
     *
     * @param dateStr   日期字符串
     * @param formatter 日期字符串格式
     * @return LocalDateTime
     */
    public static LocalDateTime parserLocalDateTime(String dateStr, String formatter) {
        return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(formatter));
    }

    /**
     * LocalDateTime 转 日期字符串
     *
     * @param date LocalDateTime
     * @return String yyyy-MM-dd HH:mm:ss
     */
    public static String formatLocalDateTime(LocalDateTime date) {
        return date.format(FORMATTER_DATE_TIME);
    }

    /**
     * LocalDateTime 转 日期字符串
     *
     * @param date    LocalDateTime
     * @param pattern 日期字符串格式
     * @return String
     */
    public static String formatLocalDateTime(LocalDateTime date, String pattern) {
        return date.format(DateTimeFormatter.ofPattern(pattern));
    }

    // endregion

    // region 年月日

    /**
     * 将 Date 转换为 LocalDate
     *
     * @param date 要转换的 Date 对象
     * @return 转换后的 LocalDate 对象
     */
    public static LocalDate dateToLocalDate(Date date) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }

    /**
     * 将 LocalDate 转换为 Date
     *
     * @param localDate 要转换的 LocalDate 对象
     * @return 转换后的 Date 对象
     */
    public static Date localDateToDate(LocalDate localDate) {
        return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }


    /**
     * 日期字符串 转 LocalDate
     *
     * @param dateStr 日期字符串 yyyy-MM-dd
     * @return LocalDate
     */
    public static LocalDate parserLocalDate(String dateStr) {
        return LocalDate.parse(dateStr, FORMATTER_DATE);
    }

    /**
     * 日期字符串 转 LocalDate
     *
     * @param dateStr   日期字符串
     * @param formatter 日期字符串格式
     * @return LocalDate
     */
    public static LocalDate parserLocalDate(String dateStr, String formatter) {
        return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(formatter));
    }

    /**
     * LocalDate 转 日期字符串
     *
     * @param date LocalDate
     * @return String yyyy-MM-dd
     */
    public static String formatLocalDate(LocalDate date) {
        return date.format(FORMATTER_DATE);
    }

    /**
     * LocalDateTime 转 日期字符串
     *
     * @param date    LocalDate
     * @param pattern 日期字符串格式
     * @return String
     */
    public static String formatLocalDate(LocalDate date, String pattern) {
        return date.format(DateTimeFormatter.ofPattern(pattern));
    }

    // endregion

}
